#ifndef CLASS_TEST_MUTEX_H_
#define CLASS_TEST_MUTEX_H_

#include <Lock.hh>
#include "Test.hh"

//
/**
 * \file MutexTest.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class MutexTest MutexTest.hh
 *
 * 
 */
class MutexTest : public Test
{
public:
	/**
	 * \name testBasicCase
	 * 
	 * 락을 사용해서 카운터를 증가시키는 경우 레이스 컨디션이 발생되는지 
	 * 확인해서 락을 검증한다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf testBasicCase(Lock* Lock);
	
protected:
	/**
	 * \name doInc
	 * 
	 * Var을 LoopCount번 증가시킨다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	static void* doInc(void* Param);
	
	/**
	 * \name doIncWithLock
	 * 
	 * Var을 LoopCount번 증가시킨다.
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	static void* doIncWithLock(void* Param);
	
protected:
	/**
	 * Var
	 */
	static Number Var;
	
private:
	/**
	 * constant
	 */
	static const Number LoopCount = 100;
};

#endif //CLASS_TEST_MUTEX_H_